/*
 * 文件名：RussiaDiamondUtil.java
 * 版权：Copyright 2006-2012 Huawei Tech. Co. Ltd. All Rights Reserved. 
 * 描述： RussiaDiamondUtil.java
 * 修改人：lKF58628
 * 修改时间：2012-3-9
 * 修改内容：新增
 */
package util;

import java.io.FileInputStream;
import java.io.IOException;
import java.net.Socket;
import java.util.List;
import java.util.Properties;

import vo.Taction;

/**
 * 俄罗斯方块工具类
 * <p>
 * <p>
 * 
 * <pre>
 * </pre>
 * 
 * @author lKF58628
 * @version RCS ND V100R002C02 2012-3-9
 * @since RCS ND V100R002C02
 */
public class RussiaDiamondUtil
{

    /**
     * 获取连接
     * 
     * @return Socket
     * @throws IOException
     */
    public static Socket getConnect()
    {
        String[] stringArr = getConnectionInfo();

        Socket s = null;
        try
        {
            String serverIP = stringArr[1];
            String serverPort = stringArr[2]; // 有用

            s = new Socket(serverIP, Integer.parseInt(serverPort));

            System.out.println("socket conect success!");
        }
        catch (Exception e)
        {
            e.printStackTrace();

            System.out.println("socket conect failed!");
        }

        return s;
    }

    /**
     * 获取连接信息
     * 
     * @return String[]
     * @throws IOException
     */
    public static String[] getConnectionInfo()
    {
        Properties props = new Properties();
        FileInputStream file = null;
        String[] str = new String[3];
        try
        {
            file = new FileInputStream("config.ini");
            props.load(file);
        }
        catch (IOException e)
        {
            System.out.println("Failed to Load config.ini");
            e.printStackTrace();
        }

        finally
        {
            if (file != null)
            {
                try
                {
                    file.close();
                }
                catch (IOException e)
                {
                    System.out.println("FFailed to close");
                    e.printStackTrace();
                }
            }
        }

        /**
         * UserName=liqiqi ServerIP=10.137.20.58 ServerPort=12345
         * */

        String userName = props.getProperty("UserName");
        String serverIP = props.getProperty("ServerIP");
        String serverPort = props.getProperty("ServerPort");

        str[0] = userName;
        str[1] = serverIP;
        str[2] = serverPort;

        return str;
    }

    /**
     * 样例二： 224123600\r\n 该样例表示：有2个步骤，步骤1旋转为2，所在列为4，下降12格；步骤2旋转为3，所在列为6，自由降到底。
     * 
     * 解析客户端返回给服务的对象为字符串,包括融错处理
     * 
     * @param listData
     *            客户端返回给服务的对象
     * 
     * @return 服务端需要的字符串
     */
    public static String encodeListData(List<Taction> listData)
    {
        StringBuffer sb = new StringBuffer(20);

        // 有几个对象就表示有几个步骤
        int stepNum = listData.size();
        sb.append(stepNum);

        // 最多支持四步
        if (stepNum > RussiaDiamondConst.MAX_STEP)
        {
            stepNum = RussiaDiamondConst.MAX_STEP;
        }

        // 2 2 4 12 3 6 00\r\n
        for (int i = 0; i < stepNum; i++)
        {
            Taction ta = listData.get(i);
            int col = ta.getColumn();

            // 如果所在列数超过最大列数，那就融错为最大列减1。
            if (col >= RussiaDiamondConst.MAX_COL)
            {
                col = RussiaDiamondConst.MAX_COL - 1;
            }

            else if (col < 0)
            {
                col = 0;
            }

            int rotate = ta.getRotate();

            // 如果旋转方向超过最大方向数，那就融错为最大方向数减1。
            if (rotate >= RussiaDiamondConst.MAX_ROTATE)
            {
                rotate = RussiaDiamondConst.MAX_ROTATE - 1;
            }
            else if (rotate < 0)
            {
                rotate = 0;
            }

            String down = ta.getDown();

            // 如果下降数目超过高度，那么直接等于“00”，降到底
            if (Integer.parseInt(down) >= RussiaDiamondConst.HEIGHT)
            {

                down = "00";
            }

            // 如果下降数目是负数，那么就是下降0位
            else if (Integer.parseInt(down) < 0)
            {
                down = "0";
            }

            // 
            sb.append(rotate).append(col).append(down);
        }

        sb.append("\r\n");

        return sb.toString();
    }
}
